#ifndef OBJECT_H
#define OBJECT_H

#include "Transform.h"

class Material;
class ObjMesh;
class Intersection;
class Ray;

// Um Object possui uma malha, um material e uma transformação
// Ao desenhar um Object, ele deve aplicar o material, a transformação e chamar draw() da malha.
// Ele também deve fazer as mudanças de sistema de coordenadas quando decessário por exemplo, em intersect.

class Object
{
public:
    Object(ObjMesh* mesh, Material* material, const Transform& transform = Transform());

    ObjMesh* getObjMesh();

    Material* getMaterial();

    Transform& getTransform();

    // Retorna true se houver interseção do raio com o objeto
    // Caso haja interseção, preenche os dados em itsc
    bool intersect(const Ray& ray, Intersection* itsc);

    void draw();

    std::string getName();

    void setName(const std::string &name);

private:
    ObjMesh *m_mesh;
    Material *m_material;
    Transform m_transform;
    std::string m_name;
};

#endif // OBJECT_H
